const express = require("express");
const fs = require("fs");
const md5 = require("md5");
const jwt = require("jsonwebtoken");
const dayjs = require("dayjs");
const { expressjwt } = require("express-jwt");
const { body, validationResult } = require("express-validator");
// multer
const multer = require("multer");

const db = require("./db.json");
const router = express.Router();

// 解析 form-data
/**
 * 1.  { dest: "./public/uploads" } 指定上传文件的存放目录
 * 2. single("dataFile") 配置上传文件的存放字段
 * */
// router.use(multer({ dest: "./public/uploads" }).single("dataFile"));
router.use(multer({ dest: "./public/uploads" }).single("dataFile"));
function valid(file) {
  // 1. 没有选择报错
  if (file === undefined) {
    return false;
  }
  // 2. 限制允许上传类型
  const allowType = ["mp4", "png"];
  // 获取选中文件的类型（后缀）
  const ext = file.originalname.split(".").slice(-1)[0];
  if (allowType.includes(ext) === false) {
    return `文件类型允许${allowType.join(",")}`;
  }
  // 3. 限制文件大小
  const allowSize = 1;
  //字节
  if (file.size > allowSize * 1024 * 1024) {
    return `文件大小不能超过${allowSize}M`;
  }
  // 清空错误信息
  return null;
}

router.post("/data", (req, res) => {
  const validmsg = valid(req.file);

  // 验证文件是否符合要求
  if (validmsg !== null) {
    // 删除上传的文件
    fs.unlink(req.file.path, (err) => {
      if (err !== null) {
        res.send("删除失败");
        return;
      }
    });
    res.status(400);``
    res.send({
      msg: validmsg,
    });
    return;
  }
  /*
  处理上传文件
  */
  // 1. 获取后缀
  const ext = req.file.originalname.split(".").slice(-1)[0];
  // 2. 重命名文件
  fs.rename(req.file.path, req.file.path + "." + ext, (err) => {
    if (err) {
      res.send("重命名失败");
    }
  });
  res.send(req.file);
});

router.get("/img", (req, res) => {
  res.sendFile("F:/code-210/mock-server/1.dio.svg");
});

router.get("/mp4", (req, res) => {
  res.sendFile("f:/video/8.json-server13-自定义路由.mp4");
});

router.get("/xml", (req, res) => {
  res.type("xml");
  res.send(`
    <user>
      <username>jack</username>
      <age>20</age>
      <gender>boy</gender>
    </user>
  `);
});

router.get("/posts", (req, res) => {
  // setTimeout(() => {
  res.send({ name: "jack", age: 20, gender: "boy" });
  // res.sendFile("f:/video/8.json-server13-自定义路由.mp4");
  // }, 2000);
});

// router.use(
//   expressjwt({ secret: "abc123", algorithms: ["HS256"] }).unless({
//     path: ["/login", "/posts"],
//   })
// );

router.post("/login", (req, res) => {
  // 获取用户名和密码
  const username = req.body.username;
  const password = md5(req.body.password);

  // 判断用户是否存在
  const data = db.users.find(
    (el) => el.username === username && el.password === password
  );
  if (data === undefined) {
    res.status(400);
    res.send({
      message: "用户名或密码错误",
      token: null,
    });
  } else {
    // 令牌  jwt 签名（生成一个“不能被破解”的加密字符串）
    const token = jwt.sign(data, "abc123");
    res.send({
      message: "登录成功",
      token,
    });
  }
});
router.post(
  "/users",
  // 定义email规则 ( req,res,next )=>{}
  body("password").notEmpty().withMessage("密码不能为空"),
  body("password").isLength({ min: 6, max: 18 }).withMessage("密码必须6-18"),
  body("username").notEmpty().withMessage("用户不能为空"),
  body("username").custom((value) => {
    if (db.users.findIndex((el) => el.username === value) !== -1) {
      throw new Error("用户名已存在");
    }
    if (/^\w{3,18}$/.test(value) === false) {
      throw new Error("用户名3-18位字符");
    }
    return true;
  }),

  body("email").notEmpty().withMessage("邮箱不能位空"),
  body("email").isEmail().withMessage("邮箱格式错误"),
  body("email").custom((value) => {
    if (db.users.findIndex((el) => el.email === value) !== -1) {
      throw new Error("邮箱已存在");
    }
    return true;
  }),
  body("phone").notEmpty().withMessage("手机不能为空"),
  body("phone").custom((value) => {
    if (db.users.findIndex((el) => el.phone === value) !== -1) {
      throw new Error("手机存在");
    }
    return true;
  }),
  body("phone").isMobilePhone("zh-CN").withMessage("手机格式错误"),
  (req, res, next) => {
    const result = validationResult(req);
    if (result.errors.length !== 0) {
      res.status(400);
      res.send(result);
    } else {
      req.body.password = md5(req.body.password);
      req.body.ctime = dayjs(new Date()).format("YYYY-MM-DD HH:mm:ss");
      next();
    }
  }
);

// GET /users

module.exports = [router];
